Ansible基础篇 - Ansible Roles用法

一、Roles 作用

当使用场景比较复杂时,单独使用 playbook 的话会增加编写 YAML 文件的复杂度,同时文件也不易理解,传承的成本较大。这时候我们就需要使用 Roles 来编写我们的 Playbook。

Roles 能够根据层次型结构自动装载变量文件、tasks 以及handlers 等。简单来说,roles 就是分别将变量、文件、任务、模板及处理器等放置于单独的目录中,并可以便捷的引用它们的一种机制。

二、Roles 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
├── ansible.cfg                # 配置文件
├── group_vars/ # 组变量
│ └── test1 # 和 inventory 中组名对应,里面写的为对应组下主机使用的所有变量信息。使用 YAML 格式。
| └── test2
├── hello_roles.yml # 入口文件
└── roles
└── nginx # roles 名称
├── default/ # 设定默认变量时使用此目录中的 main.yml 文件(不常用)
│ └── main.yml
├── files/ # 存放由 copy 或 script 模块等调用的文件
├── handles/ # 至少应该包含一个名为 main.yml 的文件;存放 handles 任务。
│ └── main.yml
├── meta/ # 定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为 main.yml 的文件(不常用)
│ └── main.yml
├── tasks/ # 定义task, role 的基本元素,至少应该包含一个名为 main.yml 的文件;
│ └── main.yml
├── templates/ # template 模块查找所需要模板文件的目录。
└── vars/ # 定义变量,至少应该包含一个名为 main.yml 的文件。
└── main.yml

ansible 并不要求 role 包含上述所有的目录及文件,只需要根据 role 的功能需要加入对应的目录和文件即可。

三、使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
1、创建目录
$ mkdir -p roles/nginx/{handlers,tasks,templates,vars}


2、创建 main.yml 和拷贝文件


├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf
└── vars
└── main.yml




3、将task任务放到 tasks/main.yml 文件内
$ cat roles/nginx/tasks/main.yml
---

- name: add group nginx
user: name=nginx state=present

- name: add user nginx
user: name=nginx state=present group=nginx

- name: Install nginx
yum: name=nginx state=latest
tags: install

- name: write the nginx config file
template: src=nginx.conf dest=/etc/nginx/nginx.conf # 不需要指定源文件路径,默认会找roles/nginx/templates目录下文件
notify:
- restart nginx
tags: template

- name: ensure nginx is running
service: name=nginx state=restarted
tags: restart




4、将使用到的变量值放到 vars/main.yml 文件内
$ cat roles/nginx/vars/main.yml
---

nginx_user: nginx
nginx_port: 80




5、将 handlers 任务放到 handlers/main.yml 文件内
$ cat roles/nginx/handlers/main.yml
---

- name: restart nginx
service: name=nginx state=restarted


6、将 template 模块拷贝的文件放到 templates 目录下
$ cat roles/nginx/templates/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/

# author: zhuqifei
# Date: 2020-10-13
# IP:{{ nginx_ip }}

user {{ nginx_user }};
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;

server {
listen {{ nginx_port }} default_server;
#listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /404.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /404.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }

}


7、设置group_vars组变量
$ for i in `ls group_vars/*`; do echo $i && cat $i; done
group_vars/test1
---

nginx_ip: 10.15.0.163

group_vars/test2
---

nginx_ip: 10.15.3.36

四、在 Playbook 调用角色(Roles)

1
2
3
4
5
6
7
$ cat hello_roles.yml
---
- hosts: all
remote_user: root

roles:
- { role: nginx, tags: [ 'nginx' ] }

可以看到通过 roles 方法执行后的结果等同于之前的 Playbook 结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ ansible-playbook -i hosts hello_roles.yml
PLAY [all] *********************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************************************************
ok: [10.15.3.36]
ok: [10.15.0.163]

TASK [add group nginx] *********************************************************************************************************************************************************************************************************************************************************
ok: [10.15.3.36]
ok: [10.15.0.163]

TASK [add user nginx] **********************************************************************************************************************************************************************************************************************************************************
ok: [10.15.3.36]
ok: [10.15.0.163]

TASK [Install nginx] ***********************************************************************************************************************************************************************************************************************************************************
ok: [10.15.3.36]
ok: [10.15.0.163]

TASK [write the nginx config file] *********************************************************************************************************************************************************************************************************************************************
ok: [10.15.3.36]
ok: [10.15.0.163]

TASK [ensure nginx is running] *************************************************************************************************************************************************************************************************************************************************
changed: [10.15.3.36]
changed: [10.15.0.163]

PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
10.15.0.163 : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.15.3.36 : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0